home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / util / arc / xadmasterdev.lha / xad / Sources / clients / xadXPK.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-20  |  2.9 KB  |  112 lines

  1. #ifndef XADMASTER_XADXPK_C
  2. #define XADMASTER_XADXPK_C
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        xadXPK.c
  7.     Main:        xadmaster
  8.     Versionstring:    $VER: xadXPK.c 1.3 (16.03.2000)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    xpk decrunch handling
  12.  
  13.  1.0   14.06.98 : first version
  14.  1.1   10.08.98 : completed xpkDecrunch
  15.  1.2   20.06.99 : removed AllocMem calls
  16.  1.3   16.03.00 : renamed from xpkstuff.c
  17. */
  18.  
  19. #include <proto/xpkmaster.h>
  20. #include <proto/xadmaster.h>
  21. #include <proto/exec.h>
  22. #include <exec/memory.h>
  23.  
  24. static LONG GetXpkError(LONG err)
  25. {
  26.   LONG ret;
  27.  
  28.   switch(err)
  29.   {
  30.     case XPKERR_OK:        ret = XADERR_OK; break;
  31.     case XPKERR_IOERRIN:    ret = XADERR_INPUT; break;
  32.     case XPKERR_IOERROUT:    ret = XADERR_OUTPUT; break;
  33.     case XPKERR_CORRUPTPKD:
  34.     case XPKERR_TRUNCATED:    ret = XADERR_ILLEGALDATA; break;
  35.     case XPKERR_NOMEM:        ret = XADERR_NOMEMORY; break;
  36.     case XPKERR_WRONGCPU:
  37.     case XPKERR_MISSINGLIB:
  38.     case XPKERR_VERSION:
  39.     case XPKERR_OLDMASTLIB:
  40.     case XPKERR_OLDSUBLIB:
  41.     case XPKERR_NOHARDWARE:
  42.     case XPKERR_BADHARDWARE:    ret = XADERR_RESOURCE; break;
  43.     case XPKERR_NEEDPASSWD:
  44.     case XPKERR_WRONGPW:    ret = XADERR_PASSWORD; break;
  45.     default:            ret = XADERR_DECRUNCH; break;
  46.   };
  47.   return ret;
  48. }
  49.  
  50. /* reads XPKF file from current input stream and stores a pointer to
  51. decrunched file in *str and the size in *size */
  52. static LONG xpkDecrunch(STRPTR *str, ULONG *size, struct xadArchiveInfo *ai,
  53. struct xadMasterBase *xadMasterBase)
  54. {
  55.   struct Library *XpkBase;
  56.   struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
  57.   ULONG buf[2];
  58.   LONG err;
  59.   ULONG *mem;
  60.   
  61.   if((XpkBase = OpenLibrary("xpkmaster.library", 4)))
  62.   {
  63.     if(!(err = xadHookAccess(XADAC_READ, 8, buf, ai)))
  64.     {
  65.       if((mem = xadAllocVec(buf[1]+8, MEMF_PUBLIC)))
  66.       {
  67.         if(!(err = xadHookAccess(XADAC_READ, buf[1], mem+2, ai)))
  68.         {
  69.           struct XpkFib xfib;
  70.  
  71.           mem[0] = buf[0];
  72.           mem[1] = buf[1];
  73.  
  74.           if(!XpkExamineTags(&xfib, XPK_InBuf, mem,
  75.           XPK_InLen, buf[1]+8, TAG_DONE))
  76.           {
  77.             STRPTR mem2;
  78.  
  79.         if((mem2 = (STRPTR) xadAllocVec(xfib.xf_ULen+XPK_MARGIN,
  80.         MEMF_PUBLIC|MEMF_CLEAR)))
  81.         {
  82.           *str = mem2;
  83.           *size = xfib.xf_ULen;
  84.  
  85.               if((err = GetXpkError(XpkUnpackTags(XPK_InBuf, mem,
  86.               XPK_InLen, buf[1]+8, XPK_OutBuf, mem2, XPK_OutBufLen,
  87.               *size + XPK_MARGIN, ai->xai_Password ? XPK_Password :
  88.               TAG_IGNORE, ai->xai_Password, XPK_UseXfdMaster, 0,
  89.               XPK_PassRequest, FALSE, TAG_DONE))))
  90.               {
  91.                 xadFreeObjectA(mem2, 0); *str = 0; *size = 0;
  92.               }
  93.             }
  94.           }
  95.           else
  96.             err = XADERR_ILLEGALDATA;
  97.         }  
  98.         xadFreeObjectA(mem, 0);
  99.       } /* xadAllocVec */
  100.       else
  101.         err = XADERR_NOMEMORY;
  102.     } /* Hook Read */
  103.     CloseLibrary(XpkBase);
  104.   } /* OpenLibrary */
  105.   else
  106.     err = XADERR_RESOURCE;
  107.  
  108.   return err;
  109. }
  110.  
  111. #endif /* XADMASTER_XADXPK_C */
  112.